home *** CD-ROM | disk | FTP | other *** search
/ Gold Medal Software 2 / Gold Medal Software Volume 2 (Gold Medal) (1994).iso / prog / asm_0_m.arj / FD.ASM < prev    next >
Assembly Source File  |  1980-01-01  |  13KB  |  410 lines

  1.      INCLUDE MACROS.ASM
  2.      BEGINCOM FILEDIR
  3.      JMP   INIT000           ;GO TO INITIALIZATION CODE
  4. ;
  5. ;  FILE DIRECTOR PROGRAM
  6. ;
  7. ;
  8. ;
  9. PATHFLAG DB    0           ;=1=PATH IS AVAILABLE
  10. PATH     DB    127 DUP (?)       ;FILE PATH
  11. FILENAME DB    64 DUP (?)
  12. CDPREFIX DB    3 DUP (?)       ;CURRENT DRIVE PREFIX (IE C:\)
  13. CURDIR     DB    64 DUP (?)
  14. CURDRV     DB    0           ;CURRENT DRIVE SAVE
  15. SPECTYPE DB    0           ;0=HANDLE, 1 = FCB TYPE I/O
  16. FCBDRIVE DB    0           ;ORIGINAL FCB DRIVE SPECIFIER
  17. AXS     DW    0           ;INBOUND REGISTER SAVE AREA
  18. BXS     DW    0
  19. CXS     DW    0
  20. DXS     DW    0
  21. DSS     DW    0
  22. ESS     DW    0
  23. SIS     DW    0
  24. DIS     DW    0
  25. ;
  26. ;  SETUP FOR FAKE INTERRUPT INTO DOS
  27. ;
  28. DOS     LABEL DWORD
  29. DOSOFF     DW    0
  30. DOSSEG     DW    0
  31. ;
  32. ; LIST OF THE DOS COMMANDS WE WANT TO TRAP
  33. ;
  34. TRAPTABL LABEL BYTE           ;DOS CALLS TO TRAP
  35.      DB    0FH,01H           ;  FCB OPEN FILE
  36. ;********DB    10H,01H           ;  FCB CLOSE FILE
  37.      DB    3DH,00H           ;  HANDLE FILE OPEN
  38. TRAPTBLE EQU   $           ;END OF TRAP TABLE
  39. PGM_ID     DB    'File Director V2.0'
  40. PGM_IDL  EQU   ($-PGM_ID)
  41.      PAGE
  42. ;****************************************************************************
  43. ;
  44. ;  File Director Mainline (All DOS interrupts come here)
  45. ;
  46. ;****************************************************************************
  47. FDIR000:
  48.      PUSH  DS
  49.      PUSH  CX
  50.      PUSH  BX
  51.      PUSH  AX
  52.      PUSH  CS
  53.      POP   DS           ;CS AND DS POINT TO THIS SEGMENT
  54.      MOV   BX,OFFSET TRAPTABL  ;POINT TO TABLE OF TRAPS
  55.      MOV   CX,((TRAPTBLE-TRAPTABL)/2)  ;ENTRY COUNT IN TABLE
  56. FDIR020: CMP   AH,[BX]           ;DOS CALL = TRAP NUMBER?
  57.      JE    FDIR040           ;YES-WERE OFF AND RUNNING
  58.      INC   BX
  59.      INC   BX
  60.      LOOP  FDIR020           ;CHECK NEXT TRAP
  61.                    ;FALL THRU = PASS CONTROL ON TO DOS
  62.      POP   AX
  63.      POP   BX
  64.      POP   CX
  65.      POP   DS
  66.      JMP   CS:DOS           ;TRANSFER CONTROL TO DOS
  67. ;
  68. ; WE HAVE A FILE OPEN COMMAND - LETS FIND THE DAMN FILE
  69. ;
  70. FDIR040:
  71.      MOV   AL,[BX+1]       ;SAVE WHETHER FCB OR HANDLE TYPE I/O
  72.      MOV   SPECTYPE,AL
  73.      POP   AX
  74.      POP   BX
  75.      POP   CX           ;LEAVE DS ON STACK
  76.      MOV   AXS,AX           ;SAVE ALL EASILY ACCESSABLE REGS
  77.      MOV   BXS,BX
  78.      MOV   CXS,CX
  79.      MOV   DXS,DX
  80.      MOV   SIS,SI
  81.      MOV   DIS,DI
  82.      POP   AX           ;POP INBOUND DS
  83.      PUSH  AX           ;AND THEN PUT IT BACK
  84.      MOV   DSS,AX           ;SAVE IT
  85.      MOV   AX,ES           ;GET INBOUND ES
  86.      MOV   ESS,AX           ;SAVE IT
  87. ;
  88. ;  CHECK DRIVE NUMBER ON FCB REQUEST
  89. ;
  90.      CMP   SPECTYPE,1       ;FCB OPERATION?
  91.      JNE   FDIR060           ;NO-SKIP THIS
  92.      MOV   BX,DXS           ;GET FCB POINTER
  93.      MOV   AX,DSS
  94.      MOV   ES,AX           ;ES:BX --> FCB
  95.      CMP   BYTE PTR ES:[BX],0FFH ;EXTENDED FCB?
  96.      JNE   FDIR050           ;NO-A REGULAR FCB
  97.      ADD   BX,7           ;MAKE BX --> DRIVE BYTE
  98. FDIR050: MOV   AL,ES:[BX]       ;GET DRIVE ASSIGNMENT
  99.      MOV   FCBDRIVE,AL       ;SAVE DRIVE
  100. ;                   ;STACK HAS INBOUND DS ON TOP
  101. ;
  102. ;  SEE IF THE FILE WILL OPEN 'AS IS' (IN THE CURRENT DIRECTORY/PATH)
  103. ;
  104. FDIR060:
  105.      MOV   AX,AXS           ;RESTORE DOS COMMAND
  106.      POP   DS           ;RESTORE INBOUND DS
  107.      PUSHF               ;FAKE AN INTERRUPT INSTR
  108.      CALL  CS:DOS           ;CALL DOS FOR OPEN
  109.      PUSH  DS           ;SAVE INBOUND DS
  110.      PUSH  AX           ;SAVE DOS RETURN VALUE
  111.      PUSHF               ;SAVE CARRY FLAG FOR HANDLE I/O
  112.      PUSH  CS
  113.      POP   DS           ;MAKE OUR SEGMENT ADDRESSABLE
  114.      CMP   PATHFLAG,0       ;IS THERE A PATH TO CHASE?
  115.      JE    FDIR090           ;NO-RETURN TO APPLICATION
  116.      CMP   SPECTYPE,0       ;IS THIS A COMMAND TO OPEN WITH A HANDLE
  117.      JNE   FDIR080           ;NO-ITS AN FCB
  118. ;
  119. ; HANDLE OPS - INITIAL TRY
  120. ;
  121.      POPF
  122.      PUSHF               ;SAVE FLAGS AGAIN
  123.      JNC   FDIR090           ;IF IT OPENED, GO BACK TO APPLICATION
  124.      CMP   AX,2           ;FILE NOT FOUND ERROR
  125.      JNE   FDIR090           ;NO-A DIFFERENT ERROR, RET TO APPLICATION
  126.      JMP   FDIR100           ;LETS GO INTO THE PATH CHASE CODE
  127. FDIR080:
  128. ;
  129. ; FCB OPS - INITIAL TRY
  130. ;
  131.      OR    AL,AL           ;FILE OPEN OK?
  132.      JNZ   FDIR400           ;NO-GO TO FCB CHASE
  133. FDIR090: JMP   FDIR800           ;** TST ** FOR NOW - JUST ABORT ON FCB'S
  134.      PAGE
  135. ;****************************************************************************
  136. ;
  137. ;  File Director HANDLE chase code STACK HAS FLAGS, AX,  THEN INBOUND DS
  138. ;
  139. ;****************************************************************************
  140. FDIR100:
  141.      POP   AX           ;REMOVE FLAGS  AND AX FROM STACK
  142.      POP   AX           ;LEAVE DS ON THERE
  143.      MOV   SI,OFFSET PATH
  144. FDIR120: CALL  BLDNAME           ;BUILD FILENAME IN FILENAME AREA
  145. ;
  146. ; LETS TRY OPENING WITH THIS PATH
  147. ;
  148.      MOV   DX,OFFSET FILENAME  ;DS:DX POINT TO FILENAME
  149.      MOV   AX,AXS           ;GET DOS OPEN COMMAND
  150.      PUSHF
  151.      CALL  DOS           ;TRY TO OPEN
  152.      PUSH  AX
  153.      PUSHF               ;SAVE DOS RETURNED FLAGS
  154.      JNC   FDIR190           ;OPENED-RETURN TO APPLICATION
  155. ;
  156. ; OPEN FAILED - TRY NEXT PATH IF ANY
  157. ;
  158. FDIR160: CMP   BYTE PTR [SI],0       ;ALL POSSIBILITIES TRIED?
  159.      JE    FDIR190           ;YES-GIVE UP
  160.      INC   SI           ;ELSE-BUMP PAST SEP CHARACTER
  161.      POP   AX
  162.      POP   AX           ;POP DOS FLAGS AND RETURN CODE OFF STK
  163.      JMP   FDIR120           ;AND GO BUILD ANOTHER NAME
  164. FDIR190: POP   BX           ;POP FLAGS OFF
  165.      POP   AX           ;GET HANDLE OR ERROR CODE
  166.      PUSH  BX
  167.      POPF               ;GET OLD FLAGS TO TEST
  168.      JNC   FDIR195           ;IF NO ERROR-SKIP ALTER ERROR CODE
  169.      CMP   AX,3           ;INVALID PATH?
  170.      JNE   FDIR195           ;NO-RETURN TO APPL
  171.      DEC   AX           ;CONVERT TO FILE NOT FOUND
  172. FDIR195: PUSH  AX
  173.      PUSH  BX           ;PUSH AX & FLAGS BACK
  174.      JMP   FDIR800           ;RETURN TO APPLICATION
  175. ;****************************************************************************
  176. ;
  177. ;  File Director FCB chase code STACK HAS FLAGS, AX,  THEN INBOUND DS
  178. ;
  179. ;****************************************************************************
  180. FDIR400:
  181. FDIR410: CMP   FCBDRIVE,0       ;GENERIC DRIVE REQUEST?
  182.      JE    FDIR420           ;YES-GO CHASE IT
  183.      JMP   FDIR800           ;SPECIFIC DRIVE REQUESTED-RETURN ERROR
  184. ;
  185. ;
  186. ;
  187. FDIR420: POPF
  188.      POP   AX           ;REMOVE FLAGS & RET CODE FROM STACK
  189.      MOV   SI,OFFSET PATH
  190. FDIR440: CALL  BLDPATH            ;SET UP A NEW PATH
  191.      MOV   BX,WORD PTR FILENAME
  192.      MOV   WORD PTR CDPREFIX,BX ;COPY PREFIX
  193.      MOV   CDPREFIX+2,'\'      ;CURRENT DIRECTORY PREFIX SET UP
  194.      MOV   DL,FILENAME       ;GET DRIVE LETTER
  195.      SUB   DL,'A'              ;INDEX (A=1,B=2,ETC)
  196.      INC   DL
  197.      PUSH  SI           ;SAVE PATH POINTER
  198.      MOV   SI,OFFSET CURDIR    ;CURRENT DIRECTORY SAVE AREA
  199.      MOV   AH,47H           ;GET CURRENT DIRECTORY COMMAND
  200.      PUSHF               ;FAKE AN INTERRUPT
  201.      CALL  CS:DOS           ;CALL DOS FOR THIS
  202. ;                   ;CURRENT DIRECTORY IS AT CURDIR FOR RESTORE
  203.      POP   SI           ;RESTORE PATH POINTER
  204.      MOV   DX,OFFSET FILENAME  ;POINT TO FILE NAME AREA (CONTAINS PATH)
  205.      MOV   AH,3BH           ;CHANGE CURRENT DIRECTORY
  206.      PUSHF               ;FAKE AN INTERRUPT
  207.      CALL  CS:DOS           ;CALL DOS FOR THIS
  208.      JC    FDIR500           ;IF ERROR-TRY NEXT PATH
  209.      MOV   BX,DXS           ;GET FCB POINTER
  210.      MOV   AX,DSS
  211.      MOV   ES,AX           ;ES:BX --> FCB
  212.      CMP   BYTE PTR ES:[BX],0FFH ;EXTENDED FCB?
  213.      JNE   FDIR450           ;NO-A REGULAR FCB
  214.      ADD   BX,7           ;MAKE BX --> DRIVE BYTE
  215. FDIR450:
  216.      MOV   AL,FILENAME       ;GET DRIVE LETTER FOR THIS PATH
  217.      SUB   AL,'A'              ;FIX UP FOR CHARACTER FORMAT
  218.      INC   AL           ;+1 SINCE DRIVE A = 1
  219.      MOV   BYTE PTR ES:[BX],AL ;RESET DRIVE BASED ON PATH
  220.      MOV   AX,AXS           ;GET DOS COMMAND
  221.      MOV   DX,DXS
  222.      POP   DS           ;DS:DS --> FCB
  223.      PUSHF               ;FAKE AN INT INSTRUCTION
  224.      CALL  CS:DOS           ;TRY TO OPEN
  225.      PUSH  DS
  226.      PUSH  AX
  227.      PUSHF               ;SAVE REGS FOR RETURNING
  228.      PUSH  CS
  229.      POP   DS           ;RESTORE OUR OWN DS
  230.      CMP   AL,0           ;OPEN OK?
  231.      JE    FDIR600           ;YES-APPLICATION RETURN
  232. ;
  233. ; OPEN FAILED - TRY NEXT PATH
  234. ;
  235. FDIR500: CMP   BYTE PTR [SI],0       ;HAVE ALL PATHS BEEN SEARCHED?
  236.      JE    FDIR600           ;YES RETURN TO APPL
  237. ;                   ;RESTORE THE OLD 'CURRENT DIRECTORY'
  238.      MOV   DX,OFFSET CDPREFIX  ;POINT TO SAVED CURRENT DIRECTORY INFO
  239.      MOV   AH,3BH           ;CHANGE CURRENT DIRECTORY
  240.      PUSHF               ;FAKE AN INTERRUPT
  241.      CALL  CS:DOS           ;CALL DOS FOR THIS
  242.      INC   SI           ;PAST SEPERATOR CHAR
  243.      POP   AX
  244.      POP   AX           ;REMOVE FLAGS & AX FROM STACK
  245.      JMP   FDIR440           ;AND TRY ANOTHER PATH
  246. ;
  247. ;  RESET THE ORIGINAL DIRECTORY IN USE BEFORE FILE OPENED
  248. ;
  249. FDIR600:
  250.      MOV   DX,OFFSET CDPREFIX  ;POINT TO SAVED CURRENT DIRECTORY INFO
  251.      MOV   AH,3BH           ;CHANGE CURRENT DIRECTORY
  252.      PUSHF               ;FAKE AN INTERRUPT
  253.      CALL  CS:DOS           ;CALL DOS FOR THIS
  254. ;
  255. ;
  256. ;  RETURN TO APPLICATION WHETHER SUCESSFUL OR NOT
  257. ;
  258. FDIR800:               ;RETURN TO APPLICATION AFTER SEARCH
  259. ;
  260. ;  RETURN TO APPLICATION
  261. ;
  262.      MOV   AX,ESS
  263.      MOV   ES,AX
  264.      MOV   BX,BXS
  265.      MOV   CX,CXS
  266.      MOV   DX,DXS
  267.      MOV   SI,SIS
  268.      MOV   DI,DIS           ;RESTORE BX,CX,DX,SI,DI
  269.      POPF               ;RESTORE DOS RETURN FLAGS
  270.      POP   AX           ;RESTORE DOS RETURN CODE/HANDLE
  271.      POP   DS           ;POP USERS DS
  272. DUMMY     PROC  FAR
  273.      RET   2           ;RETURN TO APPLICATION W/ DOS FLAGS
  274. DUMMY     ENDP
  275.      PAGE
  276. ;******************************************************************************
  277. ;
  278. ;  BUILD FILE NAME IN FILENAME AREA. SI POINTS TO CURRENT SPOT IN PATH LIST
  279. ;
  280. ;******************************************************************************
  281. BLDNAME  PROC  NEAR
  282.      CALL  BLDPATH
  283.  
  284. ; NEW PATH BUILT, APPEND FILE NAME
  285. ;
  286.      DEC   DI           ;POINT TO LAST PATH CHARACTER
  287.      CMP   BYTE PTR [DI],'\'   ;IS THERE A SEPERATOR?
  288.      JE    BLDN120           ;YES-THEN READY FOR FILE NAME
  289.      INC   DI
  290.      MOV   BYTE PTR [DI],'\'   ;ELSE-INSTALL SEPERATOR
  291. BLDN120: INC   DI           ;POINT TO NEXT AVAILABLE FILENAME BYTE
  292.      MOV   BX,DXS           ;BX HAS OFFSET OF FILE NAME
  293.      MOV   AX,DSS           ;GET INBOUND DS
  294.      MOV   ES,AX           ;INTO ES
  295. BLDN140: MOV   AL,ES:[BX]       ;GET CHAR FROM FILE NAME
  296.      MOV   [DI],AL           ;SAVE FOLLOWING THE NEW PATH
  297.      INC   BX
  298.      INC   DI           ;BUMP POINTERS
  299.      CMP   AL,0           ;AT END OF FILENAME?
  300.      JNE   BLDN140           ;NO-KEEP MOVING
  301.      RET
  302. BLDNAME  ENDP
  303. ;
  304. ;
  305. ;
  306. BLDPATH  PROC  NEAR
  307. BLDN100: MOV   DI,OFFSET FILENAME
  308. BLDP120: MOV   AL,[SI]           ;GET A PATH CHARACTER
  309.      CMP   AL,';'              ;PATH COMPLETE?
  310.      JE    BLDP140           ;YES-TRY OPENING UP
  311.      CMP   AL,0           ;END OF POSSIBLE PATHS
  312.      JE    BLDP140           ;YES-TRY OPEN (LAST POSSIBLE TRY)
  313.      MOV   [DI],AL           ;SAVE PATH CHARACTER
  314.      INC   DI
  315.      INC   SI
  316.      JMP   BLDP120           ;BUILD COMPLETE PATH
  317. BLDP140: MOV   BYTE PTR [DI],0       ;NOW HAVE AN ASCIIZ PATH
  318.      RET
  319. BLDPATH  ENDP
  320. ENDRES     EQU   $
  321.      PAGE
  322. ;
  323. ;  NON-RESIDENT CODE
  324. ;
  325. DONEMSG  DB    13,10,'FILE-DIRECTOR PATH SET UP',13,10,'$'
  326. PATHMSG  DB    13,10,'CURRENT PATH:',13,10,'$'
  327. NONEMSG  DB    '==NONE==',13,10,'$'
  328. RESFLAG  DB    0           ;ASSUME ALREADY RESIDENT
  329. INIT000:
  330.      @DOS  35H,21H           ;GET DOS'S OWN INTERRUPT VECTOR
  331.      MOV   DI,OFFSET PGM_ID    ;POINT TO NAME IN RESIDENT PGM (IF ANY)
  332.      MOV   SI,DI           ;OFFSET THE SAME IN THIS PROGRAM
  333.      MOV   CX,PGM_IDL       ;LENGTH TO COMPARE
  334. REP     CMPSB               ;IS FILE DIRECTOR RESIDENT?
  335.      JE    INIT100           ;YES-DONT KEEP RESIDENT
  336.      PUSH  DS
  337.      POP   ES           ;RESTORE ES POINTING TO THIS SEGMENT
  338.      MOV   RESFLAG,1       ;NOT RESIDENT - POINTERS ARE SET UP TO LOAD
  339. INIT100:
  340.      SUB   DX,DX           ;ACTUAL CHARACTER COUNT
  341.      MOV   SI,80H           ;ADDRESS OF PARM LENGTH COUNT
  342.      SUB   CH,CH
  343.      MOV   CL,[SI]           ;BYTES TO MOVE
  344.      MOV   DI,OFFSET PATH       ;POINT TO INPUT PATH ES POINTS TO STORAGE
  345.      OR    CX,CX           ;ANY BYTES INPUT?
  346.      JZ    INIT920           ;NO-DISPLAY PATH
  347. INIT120: INC   SI           ;POINT TO CHARACTER TO MOVE
  348.      MOV   AL,[SI]           ;GET A CHAR
  349.      CMP   AL,' '              ;BLANK?
  350.      JE    INIT140           ;YES-DISCARD
  351.      MOV   ES:[DI],AL       ;ELSE-SAVE IT
  352.      INC   DI           ;BUMP 'FROM' POINTER
  353.      INC   DX           ;CHARACTER MOVED COUNTER
  354. INIT140:
  355.      LOOP  INIT120
  356.      OR    DX,DX           ;ALL BLANK?
  357.      JZ    INIT920           ;YES-DISPLAY PATH
  358.      MOV   ES:PATHFLAG,1       ;ASSUME VALID PATH
  359.      CMP   DL,1           ;SINGLE CHARACTER?
  360.      JNE   INIT160           ;NO-THEN PROBABLY A GOOD PATH
  361.      CMP   AL,';'              ;SINGLE SEMICOLON?
  362.      JNE   INIT160           ;NO-AN INVALID BUT ACCEPTABLE PATH
  363.      MOV   ES:PATHFLAG,0       ;SET NO PATH AVAILABLE
  364. INIT160:
  365.      JZ    INIT920           ;YES-DISPLAY CURRENT PATH
  366.      MOV   BYTE PTR ES:[DI],0  ;MAKE IT AN ASCIIZ STRING
  367.      MOV   DX,OFFSET DONEMSG
  368.      @DOS  9           ;SEND DONE MESSAGE
  369.      CMP   RESFLAG,1       ;NEED TO KEEP IN CORE?
  370.      JE    INIT400           ;YES-SET DOS INTERRUPT VECTOR
  371.      INT   20H           ;ELSE - JUST SAY GOODBYE
  372. INIT400: SUB   AX,AX
  373.      MOV   ES,AX           ;ADDRESS LO CORE (DONT CHANGE INT 21 W/DOS)
  374.      MOV   BX,21H*4        ;ES:BX --> VECTOR FOR DOS
  375.      MOV   AX,ES:[BX]       ;GET DOS'S OFFSET
  376.      MOV   DOSOFF,AX
  377.      MOV   AX,ES:[BX+2]       ;GET DOS'S SEGMENT
  378.      MOV   DOSSEG,AX       ;POINTER INTO DOS IS SET
  379.      MOV   AX,OFFSET FDIR000   ;OFFSET TO THE FILE DIRECTOR MAINLINE
  380.      CLI               ;CANT HAVE INTS DURING VECTOR UPDATE
  381.      MOV   ES:[BX],AX       ;UPDATE DOS OFFSETT
  382.      MOV   AX,CS           ;NEW SEGMENT FOR DOS INT 21H
  383.      MOV   ES:[BX+2],AX       ;UPDATE DOS SEGMENT
  384.      STI               ;INTS OK NOW
  385.      MOV   DX,OFFSET ENDRES    ;POINT TO END OF RESIDENT CODE
  386. INIT900: INT   27H           ;STAY RESIDENT
  387. ;
  388. ;  DISPLAY CURRENT PATH ES:DI --> PATH
  389. ;
  390. INIT920: MOV   DX,OFFSET PATHMSG
  391.      @DOS  9
  392.      MOV   AL,ES:PATHFLAG       ;IS THERE A PATH
  393.      OR    AL,AL
  394.      JNZ   INIT930           ;YES-DISPLAY IT
  395.      MOV   DX,OFFSET NONEMSG
  396.      @DOS  9           ;DISPLAY '==NONE=='
  397.      INT   20H           ;ABORT
  398. INIT930: MOV   DL,ES:[DI]       ;GET PATH CHARACTER
  399.      OR    DL,DL           ;END?
  400.      JZ    INIT960           ;YES-APPEND CR/LF
  401.      @DOS  2           ;DISPLAY CHAR
  402.      INC   DI
  403.      JMP   INIT930           ;DO NEXT
  404. INIT960: MOV   DL,13           ;ADD CR/LF
  405.      @DOS  2
  406.      MOV   DL,10
  407.      @DOS  2
  408.      INT   20H           ;ALL DONE
  409.      ENDCOM FILEDIR
  410.